package untiring07.swing.outline;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

// Swing개요
//desktop UI 를 개발할 때 사용하는 2가지 기술
// AWT(abstract window toolkit ),Swing
//AWT : java1.0 부터 존재, 현재 Swing 으로 대체중
//Swing :AWT 의 제약을 극복하기 위해 발표
//		java 1.2 부터 도입됨
//대표적인 기능은 lookandfell임
//그럼에도 불구하고 ,java2S,java3D를 이용해서
//풍부한 그래픽 환경을 제공하려면 AWT가 필요

// AWT vs Swing
// 이 둘간의 차이점은 컴퍼넌트를 그리는 방법에 있음
// AWT는 운영체제의 라이브러리를 이용
// 따라서, AWT로 작성된 프로그램은 위도우와 리눅스에서 다르게 보임
// 하지만, Swing은 운영체제에 종속되지 않은 독립된 라이브러리를 이용
// 따라서, Swing을 이용한 프로그램은 윈도우나 리눅스에서든 똑같이 보임

//효과적인 UI개발자가 되려면?
//UI컴퍼넌트 : JFrame, JDialog, JPanel등의 최상위 컨테이너와 여기에 추가할 수 있는 각종 컴퍼넌트
// 배치관리자 layout manager : 컨테이너에 배치하는 방법
//이벤트 처리 : 버튼 클릭, 마우스 이동, 크기조절등의 이벤트에 반응하는 코드 작성

// 기본 스윙 컴퍼넌트 
// 스윙은 AWT를 대체하면, GUI 기반 프로그램 작성을 위한 자바 기술임
// 하지만, 여전히 AWT관력 기술을 사용하고 있음
// 스윙 컴퍼넌트는 javax.swing 패키지에 포함됨

// java.awt.Container
//			<- JComponent, java.awt.Window
// JComponent < - ABstractBitton, JComboBox,JLabel, JMenuBar,JPanel
// java.awt.Window
//				<- java.awt.Frame,java.awt.dialog
//ABstractButton <- JButton, JMenuItem
// java.awt.Frame <-JFrame
//java.awt.Dialog <- JDialog
//JMenuItem <-JMenu

//위에서 보듯, AWT와 스윙의 명백한 차이점은 스윙 컴퍼넌트의 이름에는 J라는 접두사가 있음

//2개의 최상위 컨테이너(JFrame, JDialog)를
//제외하고 모든 스윙 컴퍼넌트는 반드시 컨테이너에 포함되어야 함
// 일반적으로 모든 스윙 프로그램의 주 컨테이너는 JFrame 임 (중요!)

//JFrame 
// 스윙의 최상위 컨테이너 중 하나
// 다른 컴퍼넌트들을 여기에 배치하려면 add메서드를 호출
// JFrame 의 하위 컴퍼넌트인 JRootPane을 자식 요소로 가지고 있음
//따라서, 컴퍼넌트를 추가하는 코드는
// frame 명. getContentPane().add(컴퍼넌트)임
// 또한, JFrame 객체를 화면에 나타내기 위해 pack(), setVisible()메서드를 사용함
// pack(): 자식 컴퍼넌트에 따라 프레임 크기 조절
// setVisible() : JFrame 표시 여부 지정
// JFrame을 화면에서 지우려면 dispose() 메서드 호출

// 한편, JFrame의 window 영역에는 title bar와 content pane 등의 2개의 영역으로 구분
// 컴퍼넌트들을 배치할 수 있는 content pane은 JFrame 에 의해 생성되는 또 다른객체임
// 일반적으로 JPanel을 content pane 으로 사용함



public class J01HelloSwingFrame extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		// JDK 6+에서 스윙 프로그램은 invokelater 메서드를 이용해서
		// JFrame 을 호출하도록 작성하는 것을 추천!
		
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					J01HelloSwingFrame frame = new J01HelloSwingFrame();
					frame.setVisible(true);
					//생성한JFrame 을 화면에 띄움
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public J01HelloSwingFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 닫기버튼을 눌렀을때 처리할 내용
		// EXIT_ON_CLOSE :
		//System.exit()호출후 프로그램 종료
		// 위 처리내용 외의 것을 처리하려면
		// DO_NOTING_ON_CLOSE를 이용해야 함
		
		setBounds(150,150, 600, 500);
		// pack()메서드의 대체제
		// JFrame 의 크기를 변경할 떄 자주 사용
		// setBounds(x위치,y위치,너비,높이)
		// setSize(너비, 높이)
		// 주의 : setVisible 이 호출되기 전에 먼저 호출!
		
		setResizable(false);
		// JFrame 의 크기 조절 불가
		
		setTitle("Hello, Swing JFrame!!");
		//JFrame 제목 지정
		
		//JFrame 에 컴퍼넌트를 배치하기 위해JPanel을 하나 생성해서 content pane에 지정함
		contentPane = new JPanel(); // 패널 생성
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		// JPanel의 상하좌우 여백 padding지정
		// 방향은 상우하좌 (시계 방향)
		
		contentPane.setLayout(new BorderLayout(0, 0));
		// 컴퍼넌트 배치 방법을 지정
		// BorderLayout : 5개 영역으로 구분해 배치  , 영역구성 : 동서남북, 중앙
		setContentPane(contentPane);
		// 위에서 생성한 panel을 JFrame의 content pane영역으로 지정
	}

}
